#pragma once
// 把之前写的命名管道封装起来进行管理（描述起来）
#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include<unistd.h>
#define PATH "."
#define FILENAME "fifo"
// 作用是如果错误的话，打印错误信息，并返回相应的退出码
#define ERR_EXIT(m)         \
    do                      \
    {                       \
        perror(m);          \
        exit(EXIT_FAILURE); \
    } while (0)

// 命名管道的创建（封装一下）
class NameFifo
{
    // 构造函数的时候就可以把管道文件创建好
public:
    NameFifo(const std ::string &path, const std ::string &name)
        : _path(path),
          _name(name)
    {
        // 创造一个管道文件
        _fifoname = _path + "/" + _name;  //此时一个完整的pathname就成功的创建了
        int n = mkfifo(_fifoname.c_str(), 0666); // 在当前文件创造一个（命名）管道文件
        if (n < 0)
        {
            std ::cout << "mkfifo failed" << std ::endl;
        }
        else
        {
            std ::cout << "mkfifo success" << std ::endl;
        }
    }
    ~NameFifo()
    {
        int n = unlink(_fifoname.c_str()); //这个函数可以用来删除系统下的文件，给定一个绝对路径就可以。
        if(n == 0)
        {
            ERR_EXIT("unlink");
        }
        else
        {
            std :: cout  << "remove fifo failed" << std :: endl;
        }
    }
private:
    std ::string _path;     // 创建时的路径
    std ::string _name;     // 创建时管道的名字
    std ::string _fifoname; // 在使用mkfifo时完整的管道名字（pathname）
};


//使用者开始